package blog;

import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.CsvFileSource;
import org.junit.jupiter.params.provider.MethodSource;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebElement;

import java.sql.Timestamp;

import java.util.concurrent.TimeUnit;
import java.util.stream.Stream;


@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class BlogCases extends InitAndEnd {
    public static Stream<Arguments> Generator() {
        return Stream.of(
                Arguments.arguments(
                        "http://localhost:8080/blog_system/blog_detail.html?blogId=",
                        "博客详情页",
                        "自动化测试"
                )
        );
    }

    // 输入正确的账号, 密码, 登录成功
    @Order(1)
    @ParameterizedTest
    @CsvFileSource(resources = "LoginSuccess.csv")
    void LoginSuccess(String username, String password, String blog_list_url) {
        // 打开登录页面
        webDriver.get("http://localhost:8080/blog_system/login.html");
        // 输入账号
        webDriver.findElement(By.cssSelector("#username")).sendKeys(username);
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        // 输入密码
        webDriver.findElement(By.cssSelector("#password")).sendKeys(password);
        // 点击提交按钮
        webDriver.findElement(By.cssSelector("#submit")).click();
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        // 跳转到列表页
        // 获取到当前页面的 url
        String currentUrl = webDriver.getCurrentUrl();
        // 如果对应的 url 等于对应的值, 测试通过, 否则不通过
        Assertions.assertEquals(blog_list_url, currentUrl);
        // 列表页展示信息是 username
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        String cur_username = webDriver.findElement(By.cssSelector("body > div.container > div.container-left > div > h3")).getText();
        Assertions.assertEquals(username, cur_username);
    }

    // 博客列表页, 博客数量不为零
    @Order(2)
    @Test
    void BlogList() {
        // 打开博客列表页
        webDriver.get("http://localhost:8080/blog_system/blog_list.html");
        // 获取页面上所有博客标题对应的元素
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.MINUTES);
        int titleNum = webDriver.findElements(By.cssSelector(".title")).size();
        // 元素数量不为 0, 通过
        Assertions.assertNotEquals(0, titleNum);
    }

    // 博客详情页校验
    // url, 标题, title
    @Order(4)
    @ParameterizedTest
    @MethodSource("Generator")
    void BlogDetail(String expectedURL, String expectedTitle, String expectedBlogTitle) {
        // 获取第一篇博客对应的查看全文按钮
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.MINUTES);
        webDriver.findElement(By.xpath("/html/body/div[2]/div[2]/div[1]/a")).click();
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.MINUTES);
        // 获取当前页面的 url
        String curURL = webDriver.getCurrentUrl();
        // 获取当前页面的 title
        String curTitle = webDriver.getTitle();
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.MINUTES);
        // 获取博客标题
        String curBlogTitle = webDriver.findElement(By.cssSelector("body > div.container > div.container-right > h3")).getText();
        Assertions.assertEquals(expectedTitle, curTitle);
        Assertions.assertEquals(expectedBlogTitle, curBlogTitle);
        if (curTitle.contains(expectedTitle)) {
            System.out.println("测试通过");
        } else {
            System.out.println("测试不通过");
        }
    }

    // 写博客
    @Order(3)
    @Test
    void Edit() throws InterruptedException {
        //  找到写博客按钮, 点击
        webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.MINUTES);
        // 通过 js 标题进行输入
        ((JavascriptExecutor) webDriver).executeScript("document.getElementById(\"title\").value=\"自动化测试\"");
        // 点击发布
        webDriver.findElement(By.cssSelector("#submit")).click();
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.MINUTES);

        // 获取当前页面的 url
        String curURL = webDriver.getCurrentUrl();
        Assertions.assertEquals("http://localhost:8080/blog_system/blog_list.html", curURL);
    }

    // 校验已发布博客的标题和时间
    @Order(5)
    @Test
    void BlogInfoCheck() {
        webDriver.get("http://localhost:8080/blog_system/blog_list.html");
        // 获取第一篇博客的标题
        String firstBlogTitle =
                webDriver.findElement(By.cssSelector
                        ("body > div.container > div.container-right > div:nth-child(1) > div.title")).getText();
        // 获取第一篇博客的发布时间
        String firstBlogTime =
                webDriver.findElement(By.xpath("/html/body/div[2]/div[2]/div[1]/div[2]")).getText();

        // 校验博客标题是不是自动化测试
        Assertions.assertEquals("自动化测试", firstBlogTitle);
        // 如果是今天发布的, 测试通过
        Timestamp timestamp = new Timestamp(System.currentTimeMillis());
        if (firstBlogTime.contains(timestamp.toString().split(" ")[0])) {
            System.out.println("测试通过");
        } else {
            System.out.println("当前时间: " + timestamp);
            System.out.println("测试不通过");
        }
    }

    @Order(6)
    @Test
    void delete() {
        // 打开博客列表页
        webDriver.get("http://localhost:8080/blog_system/blog_list.html");
        // 获取查看全文按钮
        webDriver.findElement(By.cssSelector("body > div.container > div.container-right > div:nth-child(1) > a")).click();
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.MINUTES);
        // 点击删除按钮
        webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(6)")).click();
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.MINUTES);

        // 第一篇博客标题不是"自动化测试"
        String firstBlogTitle =
                webDriver.findElement(By.cssSelector("body > div.container > div.container-right > div:nth-child(1) > div.title")).getText();
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.MINUTES);

        // 校验当前博客标题不等于自动化测试
        Assertions.assertNotEquals(firstBlogTitle, "自动化测试");
    }

    // 注销
    @Order(7)
    @Test
    void Logout() {
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.MINUTES);
        webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(6)")).click();
        // 校验 URL(登录)
        String currentURL = webDriver.getCurrentUrl();
        Assertions.assertEquals("http://localhost:8080/blog_system/login.html", currentURL);
        // 校验登录按钮
        WebElement element = webDriver.findElement(By.cssSelector("#submit"));
        Assertions.assertNotNull(element);
    }
}
